package com.sgzn.sgpay.util.httpClient;

import lombok.Getter;

/**
 * Created by xxjs-gd-llf
 * DATETIME:2018/4/4 14:29
 * Description:
 */
public enum BizErrorCode{

    /**
     * 客服归属地与手机号归属地不一致
     */
    PROVINCE_CHECK_ERROR("300003", "客服归属地与手机号归属地不一致"),
    /**
     * 该错误码一般是在系统内部处理过程中出现不需要外部系统明确了解（如模型转化错误，非对外服务参数校验不同，内部BUG）时设定的错误码
     */
    SYSTEM_INNER_ERROR("08990001", "系统内部错误"),
    /**
     * 调用远程服务返回结果为空，定义为系统异常，可尝试重新发起
     */
    REMOTE_RESPONSE_NULL_EXCEPTION("08990002", "系统异常，请确认请求是否成功再尝试发起"),

    /**
     * 远程服务调用失败
     */
    REMOTE_INVOKE_FAIL("08990003", "远程服务调用失败"),

    /**
     * 请求远程服务超时
     */
    REMOTE_TIMEOUT_ERROR("08770001", "请求远程服务超时,请重试"),
    /**
     * RPC超时
     */
    DUBBO_TIMEOUT_ERROR("08770002", "dubbo服务超时"),
    /**
     * 请求远程服务读超时
     */
    READ_TIMEOUT_ERROR("08770003", "请求远程服务无应答"),

    /**
     * 查询数据已存在返回的异常信息
     */
    DATA_EXIST_ERROR("08880001", "数据重复存在"),
    /**
     * 执行数据库操作发生异常,具体查看数据库返回的异常信息
     */
    DATA_BASE_ERROR("08880002", "数据库操作异常"),
    /**
     * 数据更新失败
     */
    DATA_UPDATE_ERROR("08880003", "数据更新失败"),
    /**
     * 数据不存在
     */
    ERR_DATA_NOT_EXIST("08880004", "数据不存在"),

    /**
     * 参数校验不通过 ，未明确具体参数的情况使用该枚举
     */
    PARAMETER_VALID_NOT_PASS("08880005", "参数校验不通过"),
    /**
     * 参数校验不通过 ，有明确具体参数错误原因
     */
    PARAMETER_VALID_NOT_PASS_BY("08880006", "参数校验不通过,{0}"),
    /**
     * 参数对象内部属性校验不通过 ，不同于参数对象本身校验
     */
    PARAMETER_FIELD_VALID_NOT_PASS("08880007", " 参数对象内部属性校验不通过"),
    /**
     * 参数为空（含null）是非法的
     */
    BLANK_IS_ILLEGAL_PARAM("08880008", "参数为空（含null）是非法的"),
    /**
     * 参数为null（不含空字符串）是非法的
     */
    NULL_IS_ILLEGAL_PARAM("08880009", "参数为null是非法的"),
    /**
     * 根据查询参数没有找到匹配的记录
     */
    EMPTY_QUERY_RESULT("08880010", "查询结果为空"),
    /**
     * 接口返回同步失败
     */
    API_INVOKE_FAIL("08880011", "接口返回同步失败"),
    /**
     * 敏感数据加密失败
     */
    FAIL_ENCRYPT("08880012", "敏感数据加密失败"),
    /**
     * ZK抢锁失败
     */
    ZK_LOCK_ERROR("08880013", "ZK抢锁失败"),
    /**
     * 数据勾对失败
     */
    DATA_CHECK_ERROR("08880014", "数据勾对失败"),
    /**
     * 勾对定制服务运行中
     */
    CHECK_CUSTOM_IS_RUNING("08880015", "勾对定制服务运行中"),


    /**
     * fastdfs 文件上传失败
     */
    FILE_UPLOAD_ERROR("08880016", "文件上传失败"),
    /**
     * fastdfs 文件更新失败
     */
    FILE_MODIFY_ERROR("08880017", "文件更新失败"),
    /**
     * fastdfs 文件下传失败
     */
    FILE_DOWNLOAD_ERROR("08880018", "文件下传失败"),
    /**
     * fastdfs 文件删除失败
     */
    FILE_DELETE_ERROR("08880019", "文件删除失败"),
    /**
     * fastdfs 文件不存在
     */
    FILE_NOT_EXIT("08880020", "文件不存在"),
    /**
     * 文件类型不正确
     */
    FILE_FILETYPE_ERROR("08880021", "文件类型不正确"),
    /**
     * 签名校验失败
     */
    SIGN_VALIDATE_FAIL("08880022", "签名校验失败"),
    /**
     * 当前商户在该城市不支持账单支付
     */
    MERCHENT_CITY_LIMIT("08880023", "当前商户在该城市不支持账单支付"),
    /**
     * 当前商户在该省份不支持账单支付
     */
    MERCHENT_PROVINCE_LIMIT("08880024", "当前商户在该省份不支持账单支付"),
    /**
     * 验证码不存在或已失效，请重新获取.
     */
    SMS_CHECK_NOTEXIT("08880025", "验证码不存在或已失效，请重新获取。"),
    /**
     * 验证码不存在或已失效，请重新获取.
     */
    SMS_CHECK_OVERLIMIT("08880026", "验证码错误次数超限，请重新获取。"),
    /**
     * 验证码不存在或已失效，请重新获取.
     */
    SMS_CHECK_ERROR("08880027", "验证码不匹配，请重新输入。"),
    /**
     * 订单号不能重复
     */
    ORDER_REPEAT("08880028", "订单号不能重复"),
    /**
     * 订单请求流水不能重复
     */
    ORDER_REQ_REPEAT("08880029", "订单请求流水不能重复"),
    /**
     * 不能重复购买商品
     */
    ORDER_GOODS_REPEAT("08880030", "不能重复购买商品"),
    /**
     * 不存在该包月协议
     */
    AGREEMENT_NOT_EXIST("08880031", "不存在该包月协议"),
    /**
     * 服务期内无法订购不同续费类型产品
     */
    PRODUCT_CODE_SAME("08880032", "服务期内不能重复购买产品"),
    /**
     * 退订再订金额不一致
     */
    AMOUNT_NOT_SAME("08880033", "退订再订金额不一致"),
    /**
     * 续费异常，无有效的包月协议
     */
    ERROR_RENEW_AGREEMENT("08880034", "续费异常，无有效的包月协议"),
    /**
     * 续费异常，订购协议订单不存在
     */
    ERROR_RENEW_NOT_ORDER("08880035", "续费异常，订购协议订单不存在"),
    /**
     * 续费信息与协议信息不一致
     */
    ERROR_RENEW_PARAMS("08880036", "续费信息与协议信息不一致"),
    /**
     * 续费周期小，拒绝续费
     */
    ERROR_RENEW_TIME_LMIT("08880037", "续费周期小，拒绝续费"),
    /**
     * 长时间未续费，已被系统自动退订，请重新订购包月协议
     */
    ERROR_RENEW_TIME_OUT("08880038", "长时间未续费，已被系统自动退订，请重新订购包月协议"),
    /**
     * 不允许重复发起续费
     */
    ERROR_REPEAT_RENEW("08880039", "不允许重复发起续费"),
    /**
     * 该包月协议已解约
     */
    AGREEMENT_CLOSED("08880040", "该包月协议已解约"),
    /**
     * 该包月协议未签约
     */
    AGREEMENT_INIT("08880041", "该包月协议未签约"),
    /**
     * 订单信息不存在
     */
    ORDER_NOT_EXIST("08880042", "订单信息不存在"),
    /**
     * 该续费信息已失效
     */
    ORDER_NOT_EFFECTIVE("08880043", "该续费信息已失效"),
    /**
     * 商户未正确接收回调
     */
    MERCHANT_NOTIFY_FAIL("999990", "商户未正确接收回调"),
    /**
     * 订单异常
     */
    ORDER_ERROR_TO_GATEWAY("000014", "订单异常"),


    OTHER_ERROR("999999", "其他异常"),

    /**
     * 回调失败
     */
    PARAM_VALID_ERROR("050004", "非法访问"),
    /**
     * //小额平台失败的交易和初始化状态
     */
    GATE_WAY_RESP_PREFIX_ERROR("08880044", "纯网关回调失败或者该请求未受理"),


    ERROR_REPEAT_CALLBACK("050019", "不允许重复回调"),
    /**
     * 协议产品信息不存在
     */
    AGREEMENTPROD_NOT_EXIST("08880045", "协议商品信息不存在"),
    /**
     * 网关回调参数为空
     */
    GATE_WAY_CALLBACK_DATA_NULL("08880046", "网关回调账单应用请求参数为空值"),
    /**
     * 号码为黑名单
     */
    BLACK_LIST("010009", "号码为黑名单"),
    /**
     * 差异回调订单状态不能为失败
     */
    DIFFNOTIFY_REFAUSE("08880047", "差异回调订单状态不能为失败"),
    /**
     * 下单失败
     */
    BILLORDER_ACCEPT_FAIL("08880048", "下单失败"),

    /**
     * 数据解析失败
     */
    DATA_ANALYSIS_FAIL("08880049", "数据解析失败"),

    /**
     * 通知商户异常
     */
    NOTIFY_MERCHANT_FAIL("08880050", "通知商户异常"),
    /**
     * 请求频繁
     */
    BILLORDER_ACCEPT_BUSY("08880051", "请求过于频繁,请稍后再试"),

    /**
     * 商品信息校验不通过
     */
    GOODS_VALID_NOT_PASS("08880052", "商品信息校验不通过，请核实"),

    /**
     * 联通支付校验失败_此手机号所在的省份已经停用
     */
    UNICOM_PHONE_NOT_PASS("08880053", "此手机号所在的省份已经停用"),
    /**
     * 响应码不存在，此错误由于响应码转换表中没有配置转换规则导致
     */
    RESPONSECODE_NOT_EXIST("08880054", "未知异常"),

    /**
     * 手机用户被纳入黑名单用户
     */
    BLACK_LIST_PHONE("08880055", "手机用户被纳入黑名单用户"),

    /**
     * 联通计费失败
     */
    APP_PROVINCE_OFF("08880057", "此应用所在的省份已经停用"),


    /**
     * 因用户余额不足，扣费失败
     */
    PAY_FAIL_BALANCE_NO_ENOUGH("08880058", "因用户余额不足，扣费失败"),

    /**
     * 开卡3个月内不允许计费
     */
    UNICOM_PAY_FAIL("08880059", "开卡3个月内不允许计费"),

    /**
     * 超过当天扣费限额
     */
    EXCEED_DAY_LIMIT("08880060", "超过当天扣费限额"),

    /**
     * 超过省份笔日限额
     */
    EXCEED_PROVINCE_LIMIT("08880061", "超过省份笔日限额"),

    /**
     * 省份关闭
     */
    PROVINCE_OFF("08880062", "省份关闭"),

    /**
     * 当前用户已超过月限额
     */
    EXCEED_MONTH_LIMIT("08880063", "当前用户已超过月限额"),

    /**
     * 包月续费受理
     */
    INIT_PURE_GATEWAY("060000", "已受理"),
    /**
     * 续费信息不存在
     */
    RENEWINFO_NOT_EXIST("08880064", "续费信息不存在"),
    /**
     * 已有一笔订单正在处理
     */
    ORDER_IS_DEALING("050020", "已有一笔订单正在处理，请稍后再试"),

    /**
     * 为保证自主续费正常,流水号请以M开头
     */
    REQ_SEQ_ERROR("050025", "为保证自主续费正常,流水号请以M开头"),

    /**
     * 续费信息不存在
     */
    SMS_SEND_ERROR("08880065", "验证码下发失败，请重新获取"),

    /**
     * 查询接口未查询到订单
     */
    STATUS_QUERY_TIME_ERROR("08880066", "当前时间范围内未查询到该订单！"),

    /**
     * 商户信息不存在
     */
    MERCHANT_INFO_NOT_EXISTS("08880067", "商户信息不存在"),

    /**
     * 商户证书信息错误
     */
    MERCHANT_CERTIFICATE_ERROR("08880068", "商户证书信息错误"),

    /**
     * 短信退订码格式不对
     */
    DEBOOK_COMMAND_ERROR("08880069", "发送的指令有误"),
    /**
     * 抱歉，因短信频繁发送，等待60分钟后可重新发送
     */
    ERROR_SMSSEND_TOMUCH("000409", "短信发送过于频繁，请稍后再试。"),
    /**
     * 商户证书信息已存在
     */
    CERTIFICATE_ALREADY_EXISTS("08880070", "该商户证书信息已存在"),
    /**
     * 省份当前时间处于维护状态
     */
    PROVINCE_IN_TIME_CONTROL("08880071", "省公司维护，暂不支持交易"),

    /**
     * 验证码请求过于频繁，请稍后重试
     */
    VERIFYCODE_SEND_FREQUENCY("08880072", "验证码请求过于频繁，请稍后重试"),

    /**
     * 流水号前缀有误
     */
    SERIALNO_PREFIX_ERROR("08880073", "流水号前缀有误"),

    /**
     * 不允许重复发起校验
     */
    ERROR_REPEAT_VALIDATE("08880074", "不允许重复发起校验"),
    /**
     * 网关FAIL  000000的扣费失败状态
     */
    UNNORMAL_GATEWAY_STATUS("08880075", "扣费失败"),

    /**
     * 无商户信息，下单失败
     */
    NO_MERCHANT_INFO("08880076", "无商户信息，下单失败"),
    /**
     * 无商户信息，下单失败
     */
    BILLPAY_MAC_VALIDATE_FAIL("08880077", "mac校验失败"),

    /**
     * 商户无交易权限
     */
    BILLPAY_MERCHABNT_LIMITED("08880078", "商户无交易权限"),

    /**
     * 个账用户状态异常
     */
    CIF_ACCOUNT_STAT_ERROR("08880079", "用户状态异常"),
    /**
     * 支付密码已锁定
     */
    CIF_PSW_LOCK("08880080", "支付密码已被锁定"),
    /**
     * 用户星级不符
     */
    CIF_OPERATOR_GRADE_ERROR("08880081", "当前用户仅支持翼支付实名账户,请先完成实名认证"),
    /**
     * 用户信息异常
     */
    CIF_CUSTOMER_INFO_ERROR("08880082", "用户信息异常"),
    /**
     * 用户信息异常
     */
    BILLPAY_TRADEKEY_ERROR("08880083", "交易密码校验失败"),

    /**
     * 网关商户下单，暂时无法查询到支付结果,请稍后再试
     */
    BILLPAY_GW_ORDER_UNKNOWN("BE999997", "暂时无法查询到支付结果,请稍后再试!"),

    /**
     * 查询起始结束日期跨度不能超过183天
     */
    BILLPAY_BEGIN_END_LIMIT_DAYS_ERROR("400003", "查询起始结束日期跨度不能超过183天!"),

    /**
     * 网关商户下单，暂时无法查询到支付结果,请稍后再试
     */
    BILLPAY_WAIT_NOTIFY_JOB("08880084", "等待回调商户job发起回调!"),

    /**
     * 网关查询，没有找到符合条件的记录
     */
    BILLPAY_GATEWAY_NORECORD("BE110062", "没有找到符合条件的记录。"),

    /**
     * 协议手机号不匹配
     */
    AGREEMENT_PHONE_NOT_MATCH("08880085", "协议手机号不匹配"),
    /**
     * 开放平台回调商户请求连接超时
     */
    BILLPAY_MAPI_CONNECT_TIMEOUT("API500022", "http请求连接超时"),
    /**
     * 开放平台回调商户请求读取超时
     */
    BILLPAY_MAPI_READ_TIMEOUT("API500023", "http请求读取超时"),

    /**
     * 订单支付方式有误
     */
    ORDER_PAY_TYPE_ERROR("08880086", "订单支付方式有误"),

    /**
     * 订单未在查询时限范围内
     */
    BILLPAY_QUERY_TIME_LESS("08880087", "订单未在查询时限范围内"),

    /**
     * 系统维护
     */
    BILLPAY_SYSTEM_MAINTENANCE("08880088", "系统维护中,请稍候再试!"),

    /**
     * 订单号前缀有误
     */
    ORDERSEQ_PREFIX_ERROR("08880089", "订单号前缀有误"),

    /**
     * 请求流水号长度有误
     */
    SERIALNO_LENGTH_ERROR("08880090", "请求流水号长度有误（16~32位）");


    /**
     * 异常码
     */
    @Getter
    private String code;

    /**
     * 异常描述
     */
    @Getter
    private String desc;

    BizErrorCode(String code, String desc) {
        this.desc = desc;
        this.code = code;
    }

    /**
     * 错误消息资源格式化处理，比如占位符的替换等
     */
    public String getDesc(String extraMessage) {
        extraMessage = (null != extraMessage) ? extraMessage : "";
        return MessageHelper.formatMsg(this.desc, extraMessage);
    }
}
